﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace FCMS.Xml.Linq
{
    // TODO: Improve;
    public static class XElementExtensions
    {
        public static int GetSubElementValue(this XElement element, string name, int defaultValue)
        {
            XElement subElement = element.Element(name);

            string value = subElement == null ? null : subElement.Value;

            int result;
            if (String.IsNullOrEmpty(value) || !Int32.TryParse(value, out result))
            {
                return defaultValue;
            }

            return result;
        }

        public static short GetSubElementValue(this XElement element, string name, short defaultValue)
        {
            XElement subElement = element.Element(name);

            string value = subElement == null ? null : subElement.Value;

            return String.IsNullOrEmpty(value) ? defaultValue : short.Parse(value);
        }

        public static string GetSubElementValue(this XElement element, string name, string defaultValue)
        {
            XElement subElement = element.Element(name);

            string value = subElement == null ? null : subElement.Value;

            return String.IsNullOrEmpty(value) ? defaultValue : value;
        }

        public static DateTime GetSubElementValue(this XElement element, string name, DateTime defaultValue)
        {
            XElement subElement = element.Element(name);

            string value = subElement == null ? null : subElement.Value;


            return String.IsNullOrEmpty(value) ? defaultValue : DateTime.Parse(value);
        }

        public static byte? GetSubElementValue(this XElement element, string name, byte? defaultValue)
        {
            XElement subElement = element.Element(name);

            string value = subElement == null ? null : subElement.Value;

            byte result;
            if (String.IsNullOrEmpty(value) || !Byte.TryParse(value, out result))
            {
                return defaultValue;
            }

            return result;
        }

        public static short? GetSubElementValue(this XElement element, string name, short? defaultValue)
        {
            XElement subElement = element.Element(name);

            string value = subElement == null ? null : subElement.Value;

            short result;
            if (String.IsNullOrEmpty(value) || !short.TryParse(value, out result))
            {
                return defaultValue;
            }

            return result;
        }

        public static byte GetSubElementValue(this XElement element, string name, byte defaultValue)
        {
            XElement subElement = element.Element(name);

            string value = subElement == null ? null : subElement.Value;

            return String.IsNullOrEmpty(value) ? defaultValue : byte.Parse(value);
        }

        public static int GetAttributeValue(this XElement element, string name, int defaultValue)
        {
            XAttribute attribute = element.Attribute(name);

            string value = attribute == null ? null : attribute.Value;

            return String.IsNullOrEmpty(value) ? defaultValue : Int32.Parse(value);
        }

        public static byte GetAttributeValue(this XElement element, string name, byte defaultValue)
        {
            XAttribute attribute = element.Attribute(name);

            string value = attribute == null ? null : attribute.Value;

            return String.IsNullOrEmpty(value) ? defaultValue : byte.Parse(value);
        }

        public static string GetAttributeValue(this XElement element, string name, string defaultValue)
        {
            XAttribute attribute = element.Attribute(name);

            string value = attribute == null ? null : attribute.Value;

            return String.IsNullOrEmpty(value) ? defaultValue : value;
        }
    }
}
